;
;	��������� ��� ������� � ����������
;	----------------------------------
; �����: AL - ��� ASCII ������� (0 - ����������� ������)
;	 AH - ����-��� �������
;
Read_byte:
	mov	ah,0		;���� �������
	int	16h		; ��� ���
	ret
;
;	���� ����� ����������������� �����
;	----------------------------------
; ������: BL �������� ����������������� �����
;
Read_digit_hex:
	push	ax
	push	dx
	pushf
.M1:	mov	ah,8		;���� �������
	int	21h		; � ����������
	mov	dl,al           ;����������� ���� ������� � ������� DL ��� ����������� ������ �� �����
	cmp	al,30h		;��� ������� ������ 30h
	jb	.M3		; ���� �� ����� ��������
	cmp	al,39h		;��� ������� ������ 39h
	ja	.M2		; ��������� ������
	sub	al,30h          ;�������� �� ���� ������� 30h �������� ����� �� 0 �� 9
	clc			;���������� ���� CF
	jmp	.M4		;���� �� �����
.M2:	cmp	al,41h          ;��� ������� ������ 41h
	jb	.M3		; ���� �� ����� ��������
	cmp	al,46h		;��� ������� ������ 46h
	ja	.M3		; ���� �� ����� ��������
	sub	al,37h		;�������� �� ���� ������� 37h �������� ����� �� A �� F
	clc			;���������� ���� CF
	jmp	.M4             ;���� �� �����
.M3:	stc                     ;������������� ���� CF
.M4:	jc	.M1		;��������� ���� CF ���� ���������� �� ������������ � ������, ����� �������
	mov	bl,al		;���������� � ������� BL ���������� ��������
	mov	ah,2            ;������� ������ ��
	int	21h		; �����
	popf
	pop	dx
	pop	ax
	ret
;
;	���� ����������� ������������������ �����
;	-----------------------------------------
; ������: BL �������� ���������� ����������������� �����
; ������: Read_digit_hex
;
Read_byte_hex:
	push	ax
	xor	bx,bx
	call	Read_digit_hex
	mov	al,bl
	call	Read_digit_hex
	shl	al,4
	add	al,bl
	mov	bl,al
	pop	ax
	ret
;	Отображает на экран сектор (256 байт)
;	-------------------------------------
; Вызовы: Disp_line, Send_crlf
;
Disp_sector:                    
	call	Clear_screen		;Очистка зкрана
	Out_str	ReferenceLine		;Выводим справку программы
	call	Send_crlf		;Перевод строки экрана
	call	Send_crlf		; -"-
	call	Send_crlf		; -"-
	call	Send_crlf		; -"-
	xor	dx,dx			;Начало Sector
	mov	cx,16			;Число строк 16
.M:	call	Disp_line		;Вывод строки
	call	Send_crlf		;Перевод строки
	add	dx,16			;Номер первого байта следующей строки
	loop	.M			;Проверка числа строк
	ret
ReferenceLine	db	'F1-start|F2-record|F3-next|F4-edit|F5-previous|F6-arbitary|F10-end$'
;
;	Процедура дампирует 16 байт памяти в одну строку
;			шестнадцатеричных чисел
;	------------------------------------------------
; Входы: DX - номер первого байта строки в Sector
; Вызовы: Write_hex, Write_char
; Чтение: Sector
;
Disp_line:
	push	bx
	push	cx
	push	dx              
	mov	bx,dx			;В BX номер первого байта
	add	dx,[es:Address]    	;Вывод адреса первого
	call	Write_word_hex		; байта строки
	mov	dl,' '			;Вывод на экран
	call	Write_char		; пробела
	mov	cx,16			;Счетчик байтов
	push	bx			;Сохраним номер первого байта
.M1:	mov	dl,[es:Sector+bx]	;Получить один байт
	call	Write_byte_hex		;Вывод шестнадцатеричного числа
	mov	dl,' '			;Вывод на экран
	call	Write_char		; пробела
	inc	bx			;Возврат за следующим
	loop	.M1			; байтом
	pop	bx			;Получим номер первого байта
	mov	cx,16			;Счетчик байтов
.M2:	mov	dl,[es:Sector+bx]	;Получить один байт
	call	Write_char		;Выведем символ на экран
	inc	bx			;Возврат за следующим
	loop	.M2			; байтом
	pop	dx
	pop	cx
	pop	bx
	ret
;
;	Копирует в переменную Sector содержимое сектора памяти, начальный
;			адрес которого в переменной Address
;	-----------------------------------------------------------------
;
Read_sector:
	push	cx
	push	si
	push	di              
	pushf				;Сохранить флаг направления DF
	cmp	[es:Pf],byte 1		;Если Pf = 1 то считываем файл, иначе ОП
	jnz	.M			
	xor	cx,cx                   ;Величина перемещения указателя
	mov	dx,[es:Address]		; файла - Address
	mov	bx,[es:Lognum]		;Установка
	mov	al,0			; указателя
	mov	ah,42h			; на произвольную позицию
	int	21h			; файла
	mov	cx,256          
	xor	bx,bx		
.loop:	mov	[es:Sector+bx],byte 0   ;Обнуление
	inc	bx			; Sector
	loop	.loop
	push	ds
        mov	ax,data                 ;"Загрузка" виртуального сегмента данных
	mov	ds,ax                   ; в основной сегмент данных 
	mov	ah,3fh			;Функция чтения из файла
	mov	bx,[es:Lognum]		;BX <- логич. номер читаемого файла
	mov	cx,256			;CX <- число читаемых байтов
	mov	dx,Sector		;DX <- адрес-смещение буфера
	int	21h			;Чтение из файла в буфер
	pop	ds
	jnc	.Exit			;Если успешно
	call	Send_crlf               ;Перевод строки
	Out_str	ErrorReadFile		;Вывод сообщения
	call	Send_crlf               ;Перевод строки
	call	Read_byte		;Ввод символа
	jmp	.Exit			;Выход
.M:	push	ds
        mov	ax,data                 ;"Загрузка" виртуального сегмента данных
	mov	ds,ax                   ; в основной сегмент данных 
        mov	si,[es:Address]		;Откуда копировать
	mov	di,Sector		;Куда копировать
	cld				;Сбросить флаг DF
	mov	cx,256			;В счетчике число байт
	rep	movsb			;Пересылка цепочки байтов
	pop	ds
.Exit:	popf				;Восстановление флага DF
	pop	di
	pop	si
	pop	cx
	ret
ErrorReadFile db 'Error read file$'

;
;	Переписывает содержимое переменной Sector в область памяти
;	----------------------------------------------------------
;
Write_sector:
	push	cx
	push	si
	push	di		
	pushf				;Сохранить флаг направления DF
	cmp	[es:Pf],byte 1		;Если Pf = 1 то считываем файл, иначе ОП
	jnz	.M
	xor	cx,cx                   ;Величина перемещения указателя
	mov	dx,[es:Address]		; файла - Address
	mov	bx,[es:Lognum]		;Установка
	mov	al,0			; указателя
	mov	ah,42h			; на произвольную позицию
	int	21h			; файла
	push	ds
        mov	ax,data                 ;"Загрузка" виртуального сегмента данных
	mov	ds,ax                   ; в основной сегмент данных 
        mov	ah,40h			;Функция записи в файл
	mov	bx,[es:Lognum]		;BX <- логич. номер записываемого файла
	mov	cx,256			;CX <- число записываемых байтов
	mov	dx,Sector		;DX <- адрес-смещение буфера
	int	21h			;Запись из буфера в файла
	pop	ds
        jnc	.Exit			;Если успешно
	call	Send_crlf               ;Перевод строки
	Out_str	ErrorWriteFile          ;Вывод сообщения об ошибке записи файла
	call	Send_crlf               ;Перевод строки
	call	Read_byte		;Ввод символа
	jmp	.Exit			;На завершение программы
.M:	push	ds
	push	es
        mov	ax,data	                ;"Загрузка" виртуального сегмента данных
	mov	ds,ax                   ; в основной сегмент данных 
	mov	si,Sector		;Откуда копировать
	mov	di,[es:Address]		;Куда копировать
	cld				;Сбросить флаг DF
	mov	cx,256			;В счетчике число байт
	rep	movsb			;Пересылка цепочки байтов
	pop	es
	pop	ds
.Exit:	popf				;Восстановление флага DF
	pop	di
	pop	si
	pop	cx
	ret
ErrorWriteFile db 'Error write file$'
	